package com.example.znxb; // 请确保这个包名在您的项目中是合适的

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; // 默认使用 Freemarker 模板引擎

import java.util.Collections;

/**
 * MyBatis-Plus 代码生成器
 * <p>
 * 使用前请确保：
 * 1. 修改下面的数据库连接信息 (JDBC_URL, JDBC_USERNAME, JDBC_PASSWORD)
 * 2. 修改作者名称 (AUTHOR)
 * 3. 修改父包名 (PARENT_PACKAGE) 和模块名 (MODULE_NAME)
 * 4. 指定需要生成的表名 (TABLES_TO_INCLUDE)
 * 5. 确认输出路径 (OUTPUT_DIR 和 Mapper XML 的路径)
 * </p>
 */
public class CodeGenerator {

    // ==================== 配置区域 START ====================

    // --- 数据库配置 ---
    // !! 修改为你自己的数据库连接信息 !!
    private static final String JDBC_URL = "jdbc:mysql://localhost:3306/zhxb?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai";
    private static final String JDBC_USERNAME = "root";
    private static final String JDBC_PASSWORD = "root";

    // --- 生成配置 ---
    // 作者
    private static final String AUTHOR = "ZCF";
    // 代码输出目录 (默认为项目根目录下的 src/main/java)
    private static final String OUTPUT_DIR = System.getProperty("user.dir") + "/src/main/java";
    // 父包名 (例如：com.yourcompany.project)
    private static final String PARENT_PACKAGE = "com.example.znxb"; // 请修改为您的项目包名
    // 模块名 (生成的代码会放在父包下的这个模块包里，例如 com.example.znxb.user)
    private static final String MODULE_NAME = "zswd"; // 可以根据业务模块命名，如 user, order 等
    // 需要生成的表名 (可以写多个)
//     private static final String[] TABLES_TO_INCLUDE = {"your_table_name1", "your_table_name2"}; // !! 修改为你要生成的表名 !!
    private static final String[] TABLES_TO_INCLUDE = {"zswd"};
    // 需要移除的表前缀 (生成类名时会去掉这些前缀)
    private static final String[] TABLE_PREFIX_TO_REMOVE = {"t_", "c_"};

    // ==================== 配置区域 END ======================


    /**
     * 执行代码生成
     *
     * @param args 参数
     */
    public static void main(String[] args) {
        System.out.println("开始生成代码...");
        System.out.println("输出目录: " + OUTPUT_DIR);
        System.out.println("父包名: " + PARENT_PACKAGE);
        System.out.println("模块名: " + MODULE_NAME);

        // 1. 创建代码生成器对象
        FastAutoGenerator.create(JDBC_URL, JDBC_USERNAME, JDBC_PASSWORD)
                // 2. 全局配置
                .globalConfig(builder -> {
                    builder.author(AUTHOR) // 设置作者
                            // .enableSwagger() // 取消注释以开启 Swagger 模式
                            .outputDir(OUTPUT_DIR) // 指定输出目录
                            .disableOpenDir(); // 生成完成后不自动打开输出目录
                })
                // 3. 包配置
                .packageConfig(builder -> {
                    builder.parent(PARENT_PACKAGE) // 设置父包名
                            .moduleName(MODULE_NAME) // 设置父包模块名
                            // 设置 Mapper XML 生成路径 (默认为 "src/main/resources/mapper")
                            .pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + "/src/main/resources/mapper/" + MODULE_NAME));
                })
                // 4. 策略配置
                .strategyConfig(builder -> {
                    builder.addInclude(TABLES_TO_INCLUDE) // 设置需要生成的表名
                            .addTablePrefix(TABLE_PREFIX_TO_REMOVE); // 设置过滤表前缀

                    // --- Entity 策略配置 ---
                    builder.entityBuilder()
                            .enableLombok() // 使用 Lombok
                            // .logicDeleteColumnName("deleted") // 逻辑删除字段名(数据库字段)
                            // .enableTableFieldAnnotation() // 生成字段注解
                            .formatFileName("%s"); // Entity 文件名格式 (默认 %sEntity)

                    // --- Controller 策略配置 ---
                    builder.controllerBuilder()
                            .enableRestStyle() // 生成 @RestController 控制器
                            .formatFileName("%sController"); // Controller 文件名格式

                    // --- Service 策略配置 ---
                    builder.serviceBuilder()
                            .formatServiceFileName("%sService") // Service 接口名格式
                            .formatServiceImplFileName("%sServiceImpl"); // Service 实现类名格式

                    // --- Mapper 策略配置 ---
                    builder.mapperBuilder()
                           // .superClass(BaseMapper.class) // 设置父类 (如果自定义了 BaseMapper)
                           // .enableMapperAnnotation() // 开启 @Mapper 注解 (通常配合 @MapperScan 使用，二选一)
                            .enableBaseResultMap() // 启用 BaseResultMap 生成
                            .enableBaseColumnList() // 启用 BaseColumnList 生成
                            .formatMapperFileName("%sMapper") // Mapper 文件名格式
                            .formatXmlFileName("%sMapper"); // Mapper XML 文件名格式
                })
                // 5. 模板引擎配置，默认是 Freemarker，这里可以选用其他引擎：
                // .templateEngine(new VelocityTemplateEngine())
                // .templateEngine(new BeetlTemplateEngine())
                .templateEngine(new FreemarkerTemplateEngine())

                // 6. 执行生成
                .execute();

        System.out.println("代码生成完毕！");
    }

}